#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <vector>
// int main()
// {
//     pid_t id=fork();
//     if(id==0)
//     {
//         exit(1);
//     }
//     int re=0;
//     pid_t wa=wait(&re);

//     printf("%d\n",(re>>8)&0xFF);
//     printf("haha\n");
//     return 0;
// }

// int main()
// {
//     pid_t id=fork();
//     if(id<0)
//     perror("fork fail");
// if(id==0)
// {
//     printf("子进程开始运行\n");
//     sleep(5);
//     printf("子进程运行完毕\n");
// }
// else{
//     sleep(3);
//     printf("父进程开始等待\n");
//     int status=0;
//     pid_t ret=waitpid(-1,&status,0);//阻塞等待
//     if(ret==id&&WIFEXITED(status))
//     printf("子进程正常退出退出码为：%d\n",WEXITSTATUS(status));
// else
// printf("子进程错误退出\n");
// }
// return 0;
// }

typedef void (*fun)();
std::vector<fun> funs;
void fun1()
{
    printf("fun1正在运行\n");
}
void fun2()
{
    printf("fun2正在运行\n");
}

void Inset()
{
    funs.push_back(fun1);
    funs.push_back(fun2);
}
void FUN()
{
    if (funs.empty())
    {
        Inset();
    }
    for (int i = 0; i < 2; i++)
    {
        funs[i](); // funs[i]函数名
    }
}

int main()
{
    pid_t id = fork();
    if (id < 0)
    {
        perror("fork fail");
        return -1;
    }
    pid_t ret = 0;
    if (id == 0)
    {
        printf("子进程的ID：%d\n", getpid());
        printf("子进程开始运行\n");
        sleep(5);
        printf("子进程运行完毕\n");
    }
    else
    {
        int status = 0;
        do
        {
            ret = waitpid(-1, &status, WNOHANG);
            if (ret == 0)
            {
                printf("子进程正在运行\n");
            }
            sleep(1);
            FUN();
        } while (ret == 0);
        if (ret == id && WIFEXITED(status))
            printf("子进程正常退出退出码为：%d\n", WEXITSTATUS(status));
        else
            printf("子进程错误退出\n");
    }
    return 0;
}